\documentclass[twoside,a4paper]{article}
\usepackage{geometry}
\geometry{margin=1.5cm, vmargin={0pt,1cm}}
\setlength{\topmargin}{-1cm}
\setlength{\paperheight}{29.7cm}
\setlength{\textheight}{25.3cm}

% useful packages.
\usepackage[UTF8]{ctex}	% 中文支持
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{enumerate}
\usepackage{graphicx}
\usepackage{multicol}
\usepackage{fancyhdr}
\usepackage{layout}

% some common command
\newcommand{\dif}{\mathrm{d}}
\newcommand{\avg}[1]{\left\langle #1 \right\rangle}
\newcommand{\difFrac}[2]{\frac{\dif #1}{\dif #2}}
\newcommand{\pdfFrac}[2]{\frac{\partial #1}{\partial #2}}
\newcommand{\OFL}{\mathrm{OFL}}
\newcommand{\UFL}{\mathrm{UFL}}
\newcommand{\fl}{\mathrm{fl}}
\newcommand{\op}{\odot}
\newcommand{\Eabs}{E_{\mathrm{abs}}}
\newcommand{\Erel}{E_{\mathrm{rel}}}

\begin{document}
	
	\pagestyle{fancy}
	\fancyhead{}
	\lhead{行一凡 (3190105815)}
	\chead{Project \#1}
	\rhead{\today}
	
	\section*{项目结构}
	所有程序代码都位于主目录下；三个文件夹 mat、outputs、pictures 依次存放 matlab 绘图脚本、程序输出结果、生成图片。进入主目录下，输入 make run 命令编译运行主程序 main.cpp ，输出三个函数样例的近似误差以及汇报收敛速率；输入 make pic 命令编译运行绘图程序 pic.cpp ，输出绘图代码；输入 make test 命令编译运行无效程序 test.cpp ，返回输入区域无效的结果；输入 make clean 清除可执行程序。
	
	项目使用 JSON for Modern C++ 库读取 json 文件，所需头文件为 json.hpp ，在目录中给出；线性方程组用 LAPACK 求解，通过 lapackSolver.h 头文件调用。
	
	\section*{数值实现}
	对于 $ (0,1)^2 $ 区域，内部点使用标准 5 点模板
	\begin{equation}\label{key}
		-\dfrac{U_{i-1,j}-2U_{ij}+U_{i+1,j}}{h^2}-\dfrac{U_{i,j-1}-2U_{ij}+U_{i,j+1}}{h^2} = f_{ij}
	\end{equation}
	边界点使用 ghost cell 建立方程，以下边界为例：
	\begin{equation}\label{key}
		\dfrac{U_{i,1}-U_{i,-1}}{2h} = u_y,\quad \sigma = \alpha U_{i,0} + \beta\pdfFrac{u}{n}\Big|_{(i,0)} = \alpha U_{i,0} - \beta u_y
	\end{equation}
	代入可得方程
	\begin{equation}\label{key}
		\dfrac{(4\beta + 2\alpha h)U_{i,0} - 2\beta U_{i,1} - \beta U_{i-1,0} - \beta U_{i+1,0}}{h^2} = \beta f_{i,0} + \dfrac{2}{h} \sigma
	\end{equation}
	其它边界同理。将 $ (0,0),(0,1) $ 看做下边界的一部分，将 $ (0,1),(1,1) $ 看做上边界的一部分，对这 4 个点使用一阶近似
	\begin{equation}\label{key}
		\dfrac{U_{ij}-U_{i-1,j}}{h} = u_x,\quad \dfrac{U_{ij}-U_{i,j-1}}{h} = u_y
	\end{equation}
	其它点都是二阶近似。
	
	对于 $ (0,1)^2\backslash D $ 区域，先标记圆所在的网格范围，对于不在网格范围中的内部点使用标准 5 点模板；外边界点如果与内部圆的边界相乘不超过网格宽度 $ h $ 就仍然使用 ghost cell 建立方程，否则使用上述一阶近似处理；
	
	网格范围中的点如果在圆中，就放弃；如果不在圆的边界上，就使用不规则模板。对于不在边界附近的点，不规则模板是标准模板，具有二阶精度；
	
	最后，对网格与圆边界上的交点，如果它是网格点，就使用相邻格点的一阶近似；否则，由于交点附近只有一个网格点，还需要补充一个格点来近似 $ u_x,u_y $ ，就取相邻的格点或交点进行插值
	\begin{equation}\label{key}
		U_C = U_B + \dfrac{\theta}{\mu}(U_A-U_B)
	\end{equation}
	然后使用一阶近似
	\begin{equation}\label{key}
		\dfrac{U_P-U_C}{h} = u_x,\quad \dfrac{U_P-U_S}{\theta h} = u_y
	\end{equation}
	将上面两式代入边界公式就得到该点的线性方程。
	\begin{figure}[!htb]
		\centering
		\includegraphics[width=0.4\linewidth]{pictures/grid}
		\caption{插值近似}
		\label{fig:grid}
	\end{figure}
	
	\section*{测试内容}
	主程序对以下三个函数
	\begin{equation}\label{key}
		\begin{aligned}
			u(x) &= e^{y+\sin x}\\
			u(x) &= \sin(x+y) - xy\\
			u(x) &= \sin x + \sin y + xy
		\end{aligned}
	\end{equation}
	分别在 $ (0,1)^2 $ 和 $ (0,1)^2\backslash D $ 区域上求解边值问题，依次使用 Dirichlet、Neumann、Mixed 边值条件。具体边界数据存放在 inputs.json 文件中。
	
	\section*{数值结果}
	三个函数的求解误差与收敛速率在 outputs/res 中储存。下面主要说明函数
	\begin{equation}\label{key}
		u(x) = e^{y+\sin(x)}
	\end{equation}
	的计算结果、误差以及收敛速率。
	
	在 $ (0,1)^2 $ 上求解 Dirichlet 和 Mixed 边值问题的误差关于 max-norm 和 2-norm 都满足二阶收敛性，这一点在 res 文件中的收敛速率中体现，误差关于 $ n $ 的变化图像如图 3,4,5,6 ；
	
	在 $ (0,1)^2\backslash D $ 上求解 Dirichlet 边值问题的误差关于 max-norm 满足二阶收敛性，而求解 Mixed 边值问题的误差关于 max-norm 只满足一阶收敛性，这是因为后者使用的插值近似只有一阶精度。误差关于 $ n $ 的变化图像如图 7,8 ；
	
	之后依次是函数的原图像和在网格上求解得到的近似结果图，其中 Mixed 边值求解的图像与 Dirichlet 边值图像大致相同，不重复展示。在 $ (0,1)^2\backslash D $ 上的图像中，圆下方的阴影是因为网格对应点的值设为零；
	
	由于 Neumann 边值问题有无穷多解，因此其求解误差很大，不作展示。
	
	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/Omega/Dirichlet/0-norm-Err1}
		\caption{Omega Dirichlet max-norm}
		\label{fig:0-norm-err1}
	\end{figure}
	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/Omega/Dirichlet/2-norm-Err3}
		\caption{Omega Dirichlet 2-norm}
		\label{fig:2-norm-err3}
	\end{figure}
	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/Omega/Mixed/0-norm-Err4}
		\caption{Omega Mixed max-norm}
		\label{fig:0-norm-err4}
	\end{figure}
	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/Omega/Mixed/2-norm-Err6}
		\caption{Omega Mixed 2-norm}
		\label{fig:2-norm-err6}
	\end{figure}

	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/Omega-D/Dirichlet/0-norm-Err7}
		\caption{Omega-D Dirichlet max-norm}
		\label{fig:0-norm-err7}
	\end{figure}
	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/Omega-D/Mixed/0-norm-Err10}
		\caption{Omega-D Mixed max-norm}
		\label{fig:0-norm-err10}
	\end{figure}

	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/exp(y+sinx)}
		\caption{$ u(x) = e^{y+\sin x} $}
		\label{fig:expysinx}
	\end{figure}

	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/Omega/Dirichlet/Ind1}
		\caption{Omega Dirichlet $ n=8 $}
		\label{fig:ind1}
	\end{figure}
	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/Omega/Dirichlet/Ind2}
		\caption{Omega Dirichlet $ n=16 $}
		\label{fig:ind2}
	\end{figure}
	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/Omega/Dirichlet/Ind3}
		\caption{Omega Dirichlet $ n=32 $}
		\label{fig:ind3}
	\end{figure}
	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/Omega/Dirichlet/Ind4}
		\caption{Omega Dirichlet $ n=64 $}
		\label{fig:ind4}
	\end{figure}
	
	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/Omega-D/Mixed/Ind13}
		\caption{Omega-D Mixed $ n=8 $}
		\label{fig:ind13}
	\end{figure}
	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/Omega-D/Mixed/Ind14}
		\caption{Omega-D Mixed $ n=16 $}
		\label{fig:ind14}
	\end{figure}
	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/Omega-D/Mixed/Ind15}
		\caption{Omega-D Mixed $ n=32 $}
		\label{fig:ind15}
	\end{figure}
	\begin{figure}[h]
		\centering
		\includegraphics[width=0.7\linewidth]{pictures/Omega-D/Mixed/Ind16}
		\caption{Omega-D Mixed $ n=64 $}
		\label{fig:ind16}
	\end{figure}
	
\end{document}